/** * This file is part of the JCROM project. * Copyright (C) 2008-2014 - All rights reserved. * Authors: Olafur Gauti Gudmundsson, Nicolas Dos Santos * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jcrom.modeshape; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TreeMap; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.Property; import javax.jcr.PropertyIterator; import javax.jcr.PropertyType; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.nodetype.NodeType; import junit.framework.Assert; import org.jcrom.JcrDataProviderImpl; import org.jcrom.JcrFile; import org.jcrom.JcrMappingException; import org.jcrom.Jcrom; import org.jcrom.dao.ChildDAO; import org.jcrom.dao.ChildDAO2; import org.jcrom.dao.ChildDAO3; import org.jcrom.dao.ChildDAO4; import org.jcrom.dao.CustomJCRFileDAO; import org.jcrom.dao.EntityWithMapChildrenDAO; import org.jcrom.dao.ParentDAO2; import org.jcrom.dao.ParentDAO3; import org.jcrom.dao.ParentDAO4; import org.jcrom.entities.A; import org.jcrom.entities.AImpl; import org.jcrom.entities.Address; import org.jcrom.entities.B; import org.jcrom.entities.BImpl; import org.jcrom.entities.BadNode; import org.jcrom.entities.C; import org.jcrom.entities.CImpl; import org.jcrom.entities.Child; import org.jcrom.entities.Child2; import org.jcrom.entities.Child3; import org.jcrom.entities.Child4; import org.jcrom.entities.Circle; import org.jcrom.entities.CustomJCRFile; import org.jcrom.entities.CustomJCRFileParentNode; import org.jcrom.entities.Document; import org.jcrom.entities.EntityChild; import org.jcrom.entities.EntityModifiedMapFieldAdded; import org.jcrom.entities.EntityParent; import org.jcrom.entities.EntityToBeModified; import org.jcrom.entities.EntityWithMapChildren; import org.jcrom.entities.EntityWithSerializedProperties; import org.jcrom.entities.EnumEntity; import org.jcrom.entities.FinalEntity; import org.jcrom.entities.First; import org.jcrom.entities.GrandChild; import org.jcrom.entities.GrandParent; import org.jcrom.entities.Parent; import org.jcrom.entities.Parent2; import org.jcrom.entities.Parent3; import org.jcrom.entities.Parent4; import org.jcrom.entities.Person; import org.jcrom.entities.Photo; import org.jcrom.entities.ProtectedPropertyNode; import org.jcrom.entities.Rectangle; import org.jcrom.entities.ReferenceContainer; import org.jcrom.entities.ReferencedEntity; import org.jcrom.entities.Second; import org.jcrom.entities.Shape; import org.jcrom.entities.ShapeParent; import org.jcrom.entities.Square; import org.jcrom.entities.Triangle; import org.jcrom.entities.UserProfile; import org.jcrom.entities.WithParentInterface; import org.jcrom.invalidobject.InvalidEntity; import org.jcrom.util.JcrUtils; import org.jcrom.util.NodeFilter; import org.jcrom.util.PathUtils; import org.junit.Ignore; import org.junit.Test; import org.modeshape.test.ModeShapeSingleUseTest; /** * * @author Olafur Gauti Gudmundsson * @author Nicolas Dos Santos */ public class TestMapping extends ModeShapeSingleUseTest { private Parent createParent(String name) { Parent parent = new Parent(); parent.setTitle(name); parent.setBirthDay(new Date()); parent.setDrivingLicense(true); parent.setFingers(10); parent.setHairs(0L); parent.setHeight(1.80); parent.setWeight(83.54); parent.setNickName("Daddy"); parent.addTag("father"); parent.addTag("parent"); parent.addTag("male"); return parent; } private Parent2 createParent2(String name) { Parent2 parent2 = new Parent2(); parent2.setTitle(name); return parent2; } private Parent3 createParent3(String name) { Parent3 parent3 = new Parent3(); parent3.setTitle(name); return parent3; } private Parent4 createParent4(String name) { Parent4 parent4 = new Parent4(); parent4.setTitle(name); return parent4; } private Child createChild(String name) { Child child = new Child(); child.setTitle(name); child.setBirthDay(new Date()); child.setDrivingLicense(false); child.setFingers(11); child.setHairs(130000L); child.setHeight(1.93); child.setWeight(90.45); child.setNickName("Baby"); return child; } private Child2 createChild2(String name) { Child2 child2 = new Child2(); child2.setTitle(name); return child2; } private Child3 createChild3(String name) { Child3 child3 = new Child3(); child3.setTitle(name); return child3; } private Child4 createChild4(String name) { Child4 child4 = new Child4(); child4.setTitle(name); return child4; } private GrandChild createGrandChild(String name) { GrandChild grandChild = new GrandChild(); grandChild.setTitle(name); grandChild.setBirthDay(new Date()); grandChild.setDrivingLicense(false); grandChild.setFingers(12); grandChild.setHairs(130000L); grandChild.setHeight(1.37); grandChild.setWeight(42.17); grandChild.setNickName("Zima"); return grandChild; } static JcrFile createFile(String name) throws Exception { return createFile(name, false); } static JcrFile createFile(String name, boolean stream) throws Exception { JcrFile jcrFile = new JcrFile(); jcrFile.setName(name); jcrFile.setMimeType("image/jpeg"); jcrFile.setEncoding("UTF-8"); File imageFile = new File("src/test/resources/ogg.jpg"); Calendar lastModified = Calendar.getInstance(); lastModified.setTimeInMillis(imageFile.lastModified()); jcrFile.setLastModified(lastModified); if (stream) { jcrFile.setDataProvider(new JcrDataProviderImpl(new FileInputStream(imageFile))); } else { jcrFile.setDataProvider(new JcrDataProviderImpl(imageFile)); } return jcrFile; } private Photo createPhoto(String name) throws Exception { Photo jcrFile = new Photo(); jcrFile.setName(name); jcrFile.setMimeType("image/jpeg"); jcrFile.setOriginalFilename(name); File imageFile = new File("src/test/resources/ogg.jpg"); Calendar lastModified = Calendar.getInstance(); lastModified.setTimeInMillis(imageFile.lastModified()); jcrFile.setLastModified(lastModified); jcrFile.setFileSize(imageFile.length()); jcrFile.setPhotographer("Testino"); jcrFile.setChild(createParent("Kate")); jcrFile.setDataProvider(new JcrDataProviderImpl(imageFile)); // also read the file to byte array and store it that way jcrFile.setFileBytes(readBytes(new FileInputStream(imageFile))); return jcrFile; } private byte[] readBytes(InputStream in) throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { in.close(); out.close(); } return out.toByteArray(); } static void printNode(Node node, String indentation) throws Exception { System.out.println(); System.out.println(indentation + "------- NODE -------"); System.out.println(indentation + "Path: " + node.getPath()); System.out.println(indentation + "------- Properties: "); PropertyIterator propertyIterator = node.getProperties(); while (propertyIterator.hasNext()) { Property p = propertyIterator.nextProperty(); if (!p.getName().equals("jcr:data") && !p.getName().equals("jcr:mixinTypes") && !p.getName().equals("fileBytes")) { System.out.print(indentation + p.getName() + ": "); if (p.getDefinition().getRequiredType() == PropertyType.BINARY) { System.out.print("binary, (length:" + p.getLength() + ") "); } else if (!p.getDefinition().isMultiple()) { System.out.print(p.getString()); } else { for (Value v : p.getValues()) { System.out.print(v.getString() + ", "); } } System.out.println(); } if (p.getName().equals("jcr:childVersionHistory")) { System.out.println(indentation + "------- CHILD VERSION HISTORY -------"); printNode(node.getSession().getNodeByIdentifier(p.getString()), indentation + "\t"); System.out.println(indentation + "------- CHILD VERSION ENDS -------"); } } NodeIterator nodeIterator = node.getNodes(); while (nodeIterator.hasNext()) { printNode(nodeIterator.nextNode(), indentation + "\t"); } } @Test public void testGetNodesMethod() throws Exception { Node jcrRootNode = ((Session) session).getRootNode(); Node rootNode = jcrRootNode.addNode("mapSuperclassTest"); Node newNode = rootNode.addNode("newNode"); NodeIterator nodeIterator = rootNode.getNodes("myMap"); // Gets all child nodes that match 'myMap' assertFalse(nodeIterator.hasNext()); // It's not correct ! there should be an empty iterator ! session.save(); nodeIterator = rootNode.getNodes("myMap"); assertFalse(nodeIterator.hasNext()); // It's correct after saving } @Test public void testEnums() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(EnumEntity.class); EnumEntity.Suit[] suitArray = new EnumEntity.Suit[2]; suitArray[0] = EnumEntity.Suit.HEARTS; suitArray[1] = EnumEntity.Suit.CLUBS; EnumEntity enumEntity = new EnumEntity(); enumEntity.setName("MySuit"); enumEntity.setSuit(EnumEntity.Suit.DIAMONDS); enumEntity.setSuitAsArray(suitArray); enumEntity.addSuitToList(EnumEntity.Suit.SPADES); Node rootNode = ((Session) session).getRootNode().addNode("enumTest"); Node newNode = jcrom.addNode(rootNode, enumEntity); session.save(); EnumEntity fromNode = jcrom.fromNode(EnumEntity.class, newNode); assertEquals(fromNode.getSuit(), enumEntity.getSuit()); assertTrue(fromNode.getSuitAsArray().length == enumEntity.getSuitAsArray().length); assertTrue(fromNode.getSuitAsArray()[0].equals(enumEntity.getSuitAsArray()[0])); assertTrue(fromNode.getSuitAsList().size() == enumEntity.getSuitAsList().size()); assertTrue(fromNode.getSuitAsList().get(0).equals(enumEntity.getSuitAsList().get(0))); } @Test(expected = JcrMappingException.class) public void mapInvalidObject() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(InvalidEntity.class); } @Test public void serializedProperties() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(EntityWithSerializedProperties.class); EntityWithSerializedProperties entity = new EntityWithSerializedProperties(); entity.setName("withSerializedProperties"); Parent parent = createParent("John"); entity.setParent(parent); Node rootNode = ((Session) session).getRootNode().addNode("mapChildTest"); Node newNode = jcrom.addNode(rootNode, entity); session.save(); EntityWithSerializedProperties entityFromJcr = jcrom.fromNode(EntityWithSerializedProperties.class, newNode); assertTrue(entityFromJcr.getParent().getName().equals(entity.getParent().getName())); assertTrue(entityFromJcr.getParent().getBirthDay().equals(entity.getParent().getBirthDay())); assertTrue(entityFromJcr.getParent().getHeight() == entity.getParent().getHeight()); } @Test public void mapsAsChildren() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(EntityWithMapChildren.class); jcrom.map(Child.class); Integer[] myIntArr1 = { 1, 2, 3 }; Integer[] myIntArr2 = { 4, 5, 6 }; int[] myIntArr3 = { 7, 8, 9 }; int myInt1 = 1; int myInt2 = 2; String[] myStringArr1 = { "a", "b", "c" }; String[] myStringArr2 = { "d", "e", "f" }; String[] myStringArr3 = { "h", "i", "j" }; String myString1 = "string1"; String myString2 = "string2"; Locale locale = Locale.ITALIAN; Locale[] locales = { Locale.FRENCH, Locale.GERMAN }; EntityWithMapChildren entity = createEntityWithMapChildren(myIntArr1, myIntArr2, myIntArr3, myInt1, myInt2, myStringArr1, myStringArr2, myStringArr3, myString1, myString2, locale, locales); Node rootNode = ((Session) session).getRootNode().addNode("mapChildTest"); Node newNode = jcrom.addNode(rootNode, entity); session.save(); EntityWithMapChildren entityFromJcr = jcrom.fromNode(EntityWithMapChildren.class, newNode); assertTrue(entityFromJcr.getIntegers().equals(entity.getIntegers())); assertTrue(entityFromJcr.getStrings().equals(entity.getStrings())); assertTrue(entityFromJcr.getMultiInt().length == entity.getMultiInt().length); assertTrue(entityFromJcr.getMultiInt()[1] == myIntArr3[1]); assertTrue(entityFromJcr.getMultiString().length == entity.getMultiString().length); assertTrue(entityFromJcr.getIntegerArrays().size() == entity.getIntegerArrays().size()); assertTrue(entityFromJcr.getIntegerArrays().get("myIntArr1").length == myIntArr1.length); assertTrue(entityFromJcr.getIntegerArrays().get("myIntArr2").length == myIntArr2.length); assertTrue(entityFromJcr.getIntegerArrays().get("myIntArr1")[1] == myIntArr1[1]); assertTrue(entityFromJcr.getStringArrays().size() == entity.getStringArrays().size()); assertTrue(entityFromJcr.getStringArrays().get("myStringArr1").length == myStringArr1.length); assertTrue(entityFromJcr.getStringArrays().get("myStringArr2").length == myStringArr2.length); assertTrue(entityFromJcr.getStringArrays().get("myStringArr1")[1].equals(myStringArr1[1])); assertTrue(entityFromJcr.getObjects().size() == entity.getObjects().size()); assertTrue(entityFromJcr.getObjects().get("myObject1") instanceof Child); // The node name has been replaced by the key assertFalse("childName1".equals(((Child) entityFromJcr.getObjects().get("myObject1")).getName())); assertEquals("myObject1", ((Child) entityFromJcr.getObjects().get("myObject1")).getName()); assertTrue(entityFromJcr.getObjects().get("myObject2") instanceof Child); // The node name has been replaced by the key assertFalse("childName2".equals(((Child) entityFromJcr.getObjects().get("myObject2")).getName())); assertEquals("myObject2", ((Child) entityFromJcr.getObjects().get("myObject2")).getName()); assertTrue(entityFromJcr.getLocale().equals(locale)); assertTrue(entityFromJcr.getMultiLocale().length == entity.getMultiLocale().length); assertTrue(entityFromJcr.getMultiLocale()[1].equals(locales[1])); } @Test public void testPersistMapWithDAO() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(EntityWithMapChildren.class); jcrom.map(Child.class); EntityWithMapChildrenDAO dao = new EntityWithMapChildrenDAO(session, jcrom, new String[] { NodeType.MIX_VERSIONABLE }); Integer[] myIntArr1 = { 1, 2, 3 }; Integer[] myIntArr2 = { 4, 5, 6 }; int[] myIntArr3 = { 7, 8, 9 }; int myInt1 = 1; int myInt2 = 2; String[] myStringArr1 = { "a", "b", "c" }; String[] myStringArr2 = { "d", "e", "f" }; String[] myStringArr3 = { "h", "i", "j" }; String myString1 = "string1"; String myString2 = "string2"; Locale locale = Locale.ITALIAN; Locale[] locales = { Locale.FRENCH, Locale.GERMAN }; EntityWithMapChildren entity = createEntityWithMapChildren(myIntArr1, myIntArr2, myIntArr3, myInt1, myInt2, myStringArr1, myStringArr2, myStringArr3, myString1, myString2, locale, locales); dao.create(entity); EntityWithMapChildren createEntity = dao.get(entity.getPath()); assertTrue(createEntity.getIntegers().equals(entity.getIntegers())); assertTrue(createEntity.getStrings().equals(entity.getStrings())); assertTrue(createEntity.getMultiInt().length == entity.getMultiInt().length); assertTrue(createEntity.getMultiInt()[1] == myIntArr3[1]); assertTrue(createEntity.getMultiString().length == entity.getMultiString().length); assertTrue(createEntity.getIntegerArrays().size() == entity.getIntegerArrays().size()); assertTrue(createEntity.getIntegerArrays().get("myIntArr1").length == myIntArr1.length); assertTrue(createEntity.getIntegerArrays().get("myIntArr2").length == myIntArr2.length); assertTrue(createEntity.getIntegerArrays().get("myIntArr1")[1] == myIntArr1[1]); assertTrue(createEntity.getStringArrays().size() == entity.getStringArrays().size()); assertTrue(createEntity.getStringArrays().get("myStringArr1").length == myStringArr1.length); assertTrue(createEntity.getStringArrays().get("myStringArr2").length == myStringArr2.length); assertTrue(createEntity.getStringArrays().get("myStringArr1")[1].equals(myStringArr1[1])); assertTrue(createEntity.getObjects().size() == entity.getObjects().size()); assertTrue(createEntity.getObjects().get("myObject1") instanceof Child); // The node name has been replaced by the key assertFalse("childName1".equals(((Child) createEntity.getObjects().get("myObject1")).getName())); assertEquals("myObject1", ((Child) createEntity.getObjects().get("myObject1")).getName()); assertTrue(createEntity.getObjects().get("myObject2") instanceof Child); // The node name has been replaced by the key assertFalse("childName2".equals(((Child) createEntity.getObjects().get("myObject2")).getName())); assertEquals("myObject2", ((Child) createEntity.getObjects().get("myObject2")).getName()); assertTrue(createEntity.getLocale().equals(locale)); assertTrue(createEntity.getMultiLocale().length == entity.getMultiLocale().length); assertTrue(createEntity.getMultiLocale()[1].equals(locales[1])); // UPDATE Integer[] updateMyIntArr1 = { 9, 8, 7 }; Integer[] updateMyIntArr2 = { 6, 5, 4 }; int[] updateMyIntArr3 = { 3, 2, 1 }; int updateMyInt1 = 3; int updateMyInt2 = 4; String[] updateMyStringArr1 = { "k", "l", "m" }; String[] updateMyStringArr2 = { "n", "o", "p" }; String[] updateMyStringArr3 = { "q", "r", "s" }; String updateMyString1 = "string3"; String updateMyString2 = "string4"; Locale updateLocale = Locale.FRENCH; Locale[] updateLocales = { Locale.ENGLISH, Locale.GERMAN }; EntityWithMapChildren entity2 = createEntityWithMapChildren(updateMyIntArr1, updateMyIntArr2, updateMyIntArr3, updateMyInt1, updateMyInt2, updateMyStringArr1, updateMyStringArr2, updateMyStringArr3, updateMyString1, updateMyString2, updateLocale, updateLocales); entity2.setName(createEntity.getName()); entity2.setPath(createEntity.getPath()); entity2.getObjects().clear(); entity2.addObject("updateChildName1", createChildWithName("updateChildName1")); entity2.addObject("updateChildName2", createChildWithName("updateChildName2")); dao.update(entity2); EntityWithMapChildren updateEntity = dao.get(entity2.getPath()); assertTrue(updateEntity.getIntegers().equals(entity2.getIntegers())); assertTrue(updateEntity.getStrings().equals(entity2.getStrings())); assertTrue(updateEntity.getMultiInt().length == entity2.getMultiInt().length); assertTrue(updateEntity.getMultiInt()[1] == updateMyIntArr3[1]); assertTrue(updateEntity.getMultiString().length == entity2.getMultiString().length); assertTrue(updateEntity.getIntegerArrays().size() == entity2.getIntegerArrays().size()); assertTrue(updateEntity.getIntegerArrays().get("myIntArr1").length == updateMyIntArr1.length); assertTrue(updateEntity.getIntegerArrays().get("myIntArr2").length == updateMyIntArr2.length); assertTrue(updateEntity.getIntegerArrays().get("myIntArr1")[1] == updateMyIntArr1[1]); assertTrue(updateEntity.getStringArrays().size() == entity2.getStringArrays().size()); assertTrue(updateEntity.getStringArrays().get("myStringArr1").length == updateMyStringArr1.length); assertTrue(updateEntity.getStringArrays().get("myStringArr2").length == updateMyStringArr2.length); assertTrue(updateEntity.getStringArrays().get("myStringArr1")[1].equals(updateMyStringArr1[1])); assertTrue(updateEntity.getObjects().size() == entity2.getObjects().size()); assertTrue(updateEntity.getObjects().get("updateChildName1") instanceof Child); assertEquals("updateChildName1", ((Child) updateEntity.getObjects().get("updateChildName1")).getName()); assertTrue(updateEntity.getObjects().get("updateChildName2") instanceof Child); assertEquals("updateChildName2", ((Child) updateEntity.getObjects().get("updateChildName2")).getName()); assertTrue(updateEntity.getLocale().equals(updateLocale)); assertTrue(updateEntity.getMultiLocale().length == entity2.getMultiLocale().length); assertTrue(updateEntity.getMultiLocale()[1].equals(updateLocales[1])); EntityWithMapChildren versionedEntity = dao.getVersion(entity.getPath(), "1.0"); assertTrue(versionedEntity.getIntegers().equals(entity.getIntegers())); assertTrue(versionedEntity.getStrings().equals(entity.getStrings())); assertTrue(versionedEntity.getMultiInt().length == entity.getMultiInt().length); assertTrue(versionedEntity.getMultiInt()[1] == myIntArr3[1]); assertTrue(versionedEntity.getMultiString().length == entity.getMultiString().length); assertTrue(versionedEntity.getIntegerArrays().size() == entity.getIntegerArrays().size()); assertTrue(versionedEntity.getIntegerArrays().get("myIntArr1").length == myIntArr1.length); assertTrue(versionedEntity.getIntegerArrays().get("myIntArr2").length == myIntArr2.length); assertTrue(versionedEntity.getIntegerArrays().get("myIntArr1")[1] == myIntArr1[1]); assertTrue(versionedEntity.getStringArrays().size() == entity.getStringArrays().size()); assertTrue(versionedEntity.getStringArrays().get("myStringArr1").length == myStringArr1.length); assertTrue(versionedEntity.getStringArrays().get("myStringArr2").length == myStringArr2.length); assertTrue(versionedEntity.getStringArrays().get("myStringArr1")[1].equals(myStringArr1[1])); assertTrue(versionedEntity.getObjects().size() == entity.getObjects().size()); assertTrue(versionedEntity.getObjects().get("myObject1") instanceof Child); // The node name has been replaced by the key assertFalse("childName1".equals(((Child) versionedEntity.getObjects().get("myObject1")).getName())); assertEquals("myObject1", ((Child) versionedEntity.getObjects().get("myObject1")).getName()); assertTrue(versionedEntity.getObjects().get("myObject2") instanceof Child); // The node name has been replaced by the key assertFalse("childName2".equals(((Child) versionedEntity.getObjects().get("myObject2")).getName())); assertEquals("myObject2", ((Child) versionedEntity.getObjects().get("myObject2")).getName()); assertTrue(versionedEntity.getLocale().equals(locale)); assertTrue(versionedEntity.getMultiLocale().length == entity.getMultiLocale().length); assertTrue(versionedEntity.getMultiLocale()[1].equals(locales[1])); } private EntityWithMapChildren createEntityWithMapChildren(Integer[] myIntArr1, Integer[] myIntArr2, int[] myIntArr3, int myInt1, int myInt2, String[] myStringArr1, String[] myStringArr2, String[] myStringArr3, String myString1, String myString2, Locale locale, Locale[] locales) { EntityWithMapChildren entity = new EntityWithMapChildren(); entity.setName("mapEntity"); entity.addIntegerArray("myIntArr1", myIntArr1); entity.addIntegerArray("myIntArr2", myIntArr2); entity.setMultiInt(myIntArr3); entity.addStringArray("myStringArr1", myStringArr1); entity.addStringArray("myStringArr2", myStringArr2); entity.setMultiString(myStringArr3); entity.addString("myString1", myString1); entity.addString("myString2", myString2); entity.addInteger("myInt1", myInt1); entity.addInteger("myInt2", myInt2); entity.addObject("myObject1", createChildWithName("childName1")); entity.addObject("myObject2", createChildWithName("childName2")); entity.setLocale(locale); entity.setMultiLocale(locales); return entity; } private Child createChildWithName(String name) { Child child = new Child(); child.setName(name); return child; } @Test public void mapsInSuperclass() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(EntityParent.class); jcrom.map(EntityChild.class); // create person Person person = new Person(); person.setName("nico"); person.setAge(30); person.setPhones(Arrays.asList(new String[] { "0123456789" })); Map<String, String> myMap = new HashMap<String, String>(); myMap.put("key1", "value1"); myMap.put("key2", "value2"); EntityChild entity = new EntityChild(); entity.setName("myChild"); entity.setMyMap(myMap); entity.setPerson(person); Node jcrRootNode = ((Session) session).getRootNode(); Node rootNode = jcrRootNode.addNode("mapSuperclassTest"); Node newNode = jcrom.addNode(rootNode, entity); session.save(); // Export to check created nodes OutputStream out = new FileOutputStream(new File("target/jcr-export.xml")); session.exportSystemView(jcrRootNode.getPath(), out, false, false); EntityChild entityFromJcr = jcrom.fromNode(EntityChild.class, newNode); assertNotNull(entityFromJcr); assertNotNull(entityFromJcr.getMyMap()); assertEquals(2, entityFromJcr.getMyMap().size()); assertNotNull(entityFromJcr.getPerson()); assertEquals(30, entityFromJcr.getPerson().getAge()); assertEquals("nico", entityFromJcr.getPerson().getName()); } @Test public void dynamicInstantiation() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(Circle.class).map(Rectangle.class).map(ShapeParent.class).map(Square.class); Shape circle = new Circle(5); circle.setName("circle"); Shape rectangle = new Rectangle(5, 5); rectangle.setName("rectangle"); Node rootNode = ((Session) session).getRootNode().addNode("dynamicInstTest"); Node circleNode = jcrom.addNode(rootNode, circle); Node rectangleNode = jcrom.addNode(rootNode, rectangle); session.save(); Shape circleFromNode = jcrom.fromNode(Shape.class, circleNode); Shape rectangleFromNode = jcrom.fromNode(Shape.class, rectangleNode); assertTrue(circleFromNode.getArea() == circle.getArea()); assertTrue(rectangleFromNode.getArea() == rectangle.getArea()); // now try it with a parent with interface based child nodes Shape circle1 = new Circle(1); circle1.setName("circle1"); Shape circle2 = new Circle(2); circle2.setName("circle2"); Shape rectangle1 = new Rectangle(2, 2); rectangle1.setName("rectangle"); // and a subclass: Shape square = new Square(3, 3); square.setName("square"); ShapeParent shapeParent = new ShapeParent(); shapeParent.setName("ShapeParent"); shapeParent.addShape(circle1); shapeParent.addShape(rectangle1); shapeParent.addShape(square); shapeParent.setMainShape(circle2); Node shapeParentNode = jcrom.addNode(rootNode, shapeParent); session.save(); ShapeParent fromNode = jcrom.fromNode(ShapeParent.class, shapeParentNode); assertTrue(fromNode.getMainShape().getArea() == shapeParent.getMainShape().getArea()); assertTrue(fromNode.getShapes().size() == shapeParent.getShapes().size()); assertTrue(fromNode.getShapes().get(0).getArea() == shapeParent.getShapes().get(0).getArea()); assertTrue(fromNode.getShapes().get(1).getArea() == shapeParent.getShapes().get(1).getArea()); assertTrue(fromNode.getShapes().get(2).getArea() == shapeParent.getShapes().get(2).getArea()); } @Test public void references() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(ReferenceContainer.class); jcrom.map(Rectangle.class); // create the entity we will reference ReferencedEntity reference = new ReferencedEntity(); reference.setName("myReference"); reference.setBody("myBody"); ReferencedEntity reference2 = new ReferencedEntity(); reference2.setName("Reference2"); reference2.setBody("Body of ref 2."); Rectangle rectangle = new Rectangle(2, 3); rectangle.setName("rectangle"); Node rootNode = ((Session) session).getRootNode().addNode("referenceTest"); jcrom.addNode(rootNode, reference); jcrom.addNode(rootNode, reference2); jcrom.addNode(rootNode, rectangle); session.save(); // note that the ReferenceContainer and ReferencedEntity classes both have // mixin types defined in their @JcrNode annotation ReferenceContainer refContainer = new ReferenceContainer(); refContainer.setName("refContainer"); refContainer.setReference(reference); refContainer.addReference(reference); refContainer.addReference(reference2); refContainer.setReferenceByPath(reference); refContainer.addReferenceByPath(reference); refContainer.addReferenceByPath(reference2); refContainer.setShape(rectangle); Node refNode = jcrom.addNode(rootNode, refContainer); ReferenceContainer fromNode = jcrom.fromNode(ReferenceContainer.class, refNode); assertTrue(fromNode.getReference() != null); assertTrue(fromNode.getReference().getName().equals(reference.getName())); assertTrue(fromNode.getReference().getBody().equals(reference.getBody())); assertTrue(fromNode.getReferences().size() == 2); assertTrue(fromNode.getReferences().get(1).getName().equals(reference2.getName())); assertTrue(fromNode.getReferences().get(1).getBody().equals(reference2.getBody())); assertTrue(fromNode.getReferencesByPath().size() == 2); assertTrue(fromNode.getReferencesByPath().get(1).getName().equals(reference2.getName())); assertTrue(fromNode.getReferencesByPath().get(1).getBody().equals(reference2.getBody())); assertTrue(fromNode.getReferenceByPath() != null); assertTrue(fromNode.getReferenceByPath().getName().equals(reference.getName())); assertTrue(fromNode.getReferenceByPath().getBody().equals(reference.getBody())); assertTrue(fromNode.getShape().getArea() == rectangle.getArea()); } @Ignore @Test public void versioningDAO() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child1 = new VersionedEntity(); child1.setName("child1"); child1.setBody("child1Body"); VersionedEntity child2 = new VersionedEntity(); child2.setName("child2"); child2.setBody("child2Body"); entity.addVersionedChild(child1); entity.addVersionedChild(child2); Child child3 = createChild("John"); entity.addUnversionedChild(child3); VersionedEntity test = new VersionedEntity(); test.setName("testChild"); test.setBody("testBody"); entity.versionedChild1 = test; VersionedEntity test2 = new VersionedEntity(); test2.setName("testChild2"); test2.setBody("testBody2"); entity.versionedChild2 = test2; versionedDao.create(entity); // change it entity.setBody("Second"); entity.getUnversionedChildren().get(0).setNickName("Kalli"); entity.getVersionedChildren().get(0).setBody("zimbob"); entity.versionedChild1.setBody("mybody"); entity.versionedChild2.setBody("mybody2"); versionedDao.update(entity); // change it again entity.setBody("SecondSecond"); versionedDao.update(entity); assertEquals(3, versionedDao.getVersionSize(entity.getPath())); // load entity VersionedEntity loadedEntity = versionedDao.get(entity.getPath()); assertEquals("1.2", loadedEntity.getBaseVersionName()); assertEquals("1.2", loadedEntity.getVersionName()); assertEquals("Kalli", loadedEntity.getUnversionedChildren().get(0).getNickName()); assertEquals("zimbob", loadedEntity.getVersionedChildren().get(0).getBody()); assertEquals("mybody", loadedEntity.versionedChild1.getBody()); assertEquals("mybody2", loadedEntity.versionedChild2.getBody()); assertTrue(loadedEntity.getUnversionedChildren().size() == entity.getUnversionedChildren().size()); assertTrue(versionedDao.getVersionList(entity.getPath()).size() == versionedDao.getVersionSize(entity.getPath())); VersionedEntity middleVersion = versionedDao.getVersion(entity.getPath(), "1.2"); assertNotNull(middleVersion); // restore versionedDao.restoreVersion(entity.getPath(), "1.0"); loadedEntity = versionedDao.get(entity.getPath()); assertTrue(loadedEntity.getBaseVersionName().equals("1.0")); Child loadedChild3 = loadedEntity.getUnversionedChildren().get(0); assertEquals("Baby", loadedChild3.getNickName()); loadedEntity.setBody("Third"); versionedDao.update(loadedEntity); VersionedEntity oldEntity = versionedDao.getVersion(entity.getPath(), "1.0"); assertTrue(oldEntity != null); assertTrue(oldEntity.getBody().equals("First")); List<VersionedEntity> versions = versionedDao.getVersionList(entity.getPath()); for (VersionedEntity version : versions) { System.out.println("Version [" + version.getVersionName() + "] [" + version.getBody() + "], base [" + version.getBaseVersionName() + "] [" + version.getBaseVersionCreated() + "]"); } // move VersionedEntity anotherEntity = new VersionedEntity(); anotherEntity.setName("anotherEntity"); anotherEntity.setBody("anotherBody"); versionedDao.create(rootNode.getPath(), anotherEntity); VersionedEntity childEntity = loadedEntity.getVersionedChildren().get(0); versionedDao.move(childEntity, anotherEntity.getPath() + "/versionedChildren"); assertTrue(versionedDao.exists(anotherEntity.getPath() + "/versionedChildren/" + childEntity.getName())); // remove child versionedDao.remove(loadedEntity.getVersionedChildren().get(1).getPath()); assertFalse(versionedDao.exists(loadedEntity.getVersionedChildren().get(1).getPath())); VersionedEntity addVersionedEntity = new VersionedEntity(); addVersionedEntity.setName("newAddedEntity"); addVersionedEntity.setBody("newAddedEntity"); loadedEntity.getVersionedChildren().add(addVersionedEntity); versionedDao.update(loadedEntity); versionedDao.remove(loadedEntity.getPath()); } /** * Thanks to Andrius Kurtinaitis for identifying this problem and * contributing this test case. * @throws Exception */ @Test public void versioningDAOChild1() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setName("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); entity.versionedChild1 = child; versionedDao.create(entity); VersionedEntity fromNode = versionedDao.getVersion(entity.getPath(), "1.0"); assertEquals(child.getBody(), fromNode.versionedChild1.getBody()); } /** * Thanks to Andrius Kurtinaitis for identifying this problem and * contributing this test case. * @throws Exception */ @Test public void versioningDAOChild2() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); entity.versionedChild2 = child; versionedDao.create(entity); assertEquals(child.getBody(), versionedDao.getVersion(entity.getPath(), "1.0").versionedChild2.getBody()); } /** * Thanks to Andrius Kurtinaitis for identifying this problem and * contributing this test case. * @throws Exception */ @Test public void versioningDAOChild3() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); entity.versionedChild3 = child; versionedDao.create(entity); assertEquals(child.getBody(), versionedDao.getVersion(entity.getPath(), "1.0").versionedChild3.getBody()); } /** * Thanks to Andrius Kurtinaitis for identifying this problem and * contributing this test case. * @throws Exception */ @Test public void versioningDAOChild4() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); entity.versionedChild4 = child; versionedDao.create(entity); assertEquals(child.getBody(), versionedDao.getVersion(entity.getPath(), "1.0").versionedChild4.getBody()); } @Test public void versioningDAOChild5() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); entity.versionedChild4 = child; versionedDao.create(entity); assertEquals(child.getBody(), versionedDao.getVersion(entity.getPath(), "1.0").versionedChild4.getBody()); child.setTitle("child1 with new title"); child = versionedDao.update(child); assertEquals(child.getTitle(), versionedDao.get(child.getPath()).getTitle()); } @Test public void versioningDAOChild6() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(VersionedEntity.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("versionedEntities"); VersionedDAO versionedDao = new VersionedDAO(session, jcrom); VersionedEntity entity = new VersionedEntity(); entity.setTitle("MyEntity"); entity.setBody("First"); entity.setPath(rootNode.getPath()); versionedDao.create(entity); VersionedEntity child = new VersionedEntity(); child.setName("child1"); child.setBody("child1Body"); child.setPath(entity.getPath()); versionedDao.create(child); assertEquals(child.getBody(), versionedDao.getVersion(entity.getPath() + "/" + child.getName(), "1.0").getBody()); } @Test public void testDAOs() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(Parent.class); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("parents"); ParentDAO parentDao = new ParentDAO(session, jcrom); Parent dad = createParent("John Bobs"); dad.setDrivingLicense(false); dad.setPath(rootNode.getPath()); dad.setAdoptedChild(createChild("AdoptedChild1")); dad.addChild(createChild("Child1")); dad.addChild(createChild("Child2")); Parent mom = createParent("Jane"); mom.setPath(rootNode.getPath()); // mom is created directly under root assertFalse(parentDao.exists(dad.getPath() + "/" + dad.getName())); parentDao.create(dad); parentDao.create(mom); session.save(); assertTrue(parentDao.exists(dad.getPath())); Parent loadedParent = parentDao.get(dad.getPath()); assertTrue(loadedParent.getNickName().equals(dad.getNickName())); Parent uuidParent = parentDao.loadByUUID(loadedParent.getUuid()); assertTrue(uuidParent.getNickName().equals(dad.getNickName())); Parent idParent = parentDao.loadById(loadedParent.getId()); assertTrue(idParent.getNickName().equals(dad.getNickName())); Parent loadedMom = parentDao.get(mom.getPath()); assertTrue(loadedMom.getNickName().equals(mom.getNickName())); // test second level update loadedParent.getAdoptedChild().setNickName("testing"); loadedParent.getChildren().get(0).setNickName("hello"); parentDao.update(loadedParent, NodeFilter.INCLUDE_ALL, 2); Parent updatedParent = parentDao.get(dad.getPath()); assertEquals(loadedParent.getAdoptedChild().getNickName(), updatedParent.getAdoptedChild().getNickName()); assertEquals(loadedParent.getChildren().get(0).getNickName(), updatedParent.getChildren().get(0).getNickName()); List<Parent> parents = parentDao.findAll(rootNode.getPath()); assertTrue(parents.size() == 2); List<Parent> parentsWithLicense = parentDao.findByLicense(); assertTrue(parentsWithLicense.size() == 1); parentDao.remove(dad.getPath()); assertFalse(parentDao.exists(dad.getPath())); parentDao.remove(loadedMom.getPath()); assertFalse(parentDao.exists(mom.getPath())); // test a root level node Parent rootDad = createParent("John Smith"); parentDao.create("/", rootDad); assertTrue(rootDad.getPath().equals("/" + rootDad.getName())); // rename a root level node rootDad.setName("John Smythe"); parentDao.update(rootDad); } @Test public void testDAOCreateNode() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(Parent.class); jcrom.map(Parent2.class); jcrom.map(Parent3.class); jcrom.map(Parent4.class); jcrom.map(Child4.class); ParentDAO parentDao = new ParentDAO(session, jcrom); ParentDAO2 parentDao2 = new ParentDAO2(session, jcrom); ParentDAO3 parentDao3 = new ParentDAO3(session, jcrom); ParentDAO4 parentDao4 = new ParentDAO4(session, jcrom); ChildDAO childDao = new ChildDAO(session, jcrom); ChildDAO2 childDao2 = new ChildDAO2(session, jcrom); ChildDAO3 childDao3 = new ChildDAO3(session, jcrom); ChildDAO4 childDao4 = new ChildDAO4(session, jcrom); // create the root Node rootNode = ((Session) session).getRootNode().addNode("content").addNode("parents"); Parent2 p2 = createParent2("John Bobs 2"); // Single child assertFalse(parentDao.exists(rootNode.getPath() + "/" + p2.getName())); Parent3 p3 = createParent3("John Bobs 3"); // Multiple Child assertFalse(parentDao.exists(rootNode.getPath() + "/" + p3.getName())); Parent4 p4 = createParent4("John Bobs 4"); // Map of Child assertFalse(parentDao.exists(rootNode.getPath() + "/" + p4.getName())); parentDao2.create(p2); parentDao3.create(p3); parentDao4.create(p4); session.save(); assertTrue(parentDao2.exists(p2.getPath())); assertTrue(parentDao3.exists(p3.getPath())); assertTrue(parentDao4.exists(p4.getPath())); Child2 child21 = createChild2("Child21"); child21.setParent2(p2); Child3 child31 = createChild3("Child31"); child31.setParent3(p3); Child3 child32 = createChild3("Child32"); child32.setParent3(p3); Child4 child41 = createChild4("Child41"); child41.setParent4(p4); Child4 child42 = createChild4("Child42"); child42.setParent4(p4); child21 = childDao2.create(child21); child31 = childDao3.create(child31); child32 = childDao3.create(child32); child41 = childDao4.create(child41); child42 = childDao4.create(child42); p2 = parentDao2.get(p2.getPath()); p3 = parentDao3.get(p3.getPath()); p4 = parentDao4.get(p4.getPath()); assertNotNull(p2.getChild()); assertEquals(child21.getPath(), p2.getChild().getPath()); assertNotNull(p3.getChildren()); assertEquals(2, p3.getChildren().size()); assertEquals(child31.getPath(), p3.getChildren().get(0).getPath()); assertEquals(child32.getPath(), p3.getChildren().get(1).getPath()); assertNotNull(p4.getMap()); assertEquals(2, p4.getMap().size()); Child4 c41 = (Child4) p4.getMap().get(child41.getName()); assertEquals(child41.getPath(), c41.getPath()); Child4 c42 = (Child4) p4.getMap().get(child42.getName()); assertEquals(child42.getPath(), c42.getPath()); /******************************************/ Parent dad = createParent("John Bobs"); dad.setAdoptedChild(createChild("AdoptedChild1")); dad.addChild(createChild("Child1")); dad.addChild(createChild("Child2")); assertFalse(parentDao.exists(rootNode.getPath() + "/" + dad.getName())); Parent mom = createParent("Jane"); assertFalse(parentDao.exists(rootNode.getPath() + "/" + mom.getName())); parentDao.create(dad); parentDao.create(mom); session.save(); assertTrue(parentDao.exists(dad.getPath())); assertTrue(parentDao.exists(mom.getPath())); Child c = createChild("Child3"); c.setParent(mom); try { c = childDao.create(c); // Exception, multiple child fields found } catch (JcrMappingException e) { return; } Assert.fail("The unit test must not pass here."); } /* @Test public void versioning() throws Exception { Node node = ((Session) session).getRootNode().addNode("versionTest"); node.addMixin("mix:versionable"); node.setProperty("title", "version 1"); session.save(); node.checkin(); node.checkout(); node.setProperty("title", "version 2"); session.save(); node.checkin(); node.checkout(); node.setProperty("title", "version 3"); session.save(); node.checkin(); // print version history VersionHistory history = ((Session) session).getRootNode().getNode("versionTest").getVersionHistory(); VersionIterator iterator = history.getAllVersions(); iterator.skip(1); while ( iterator.hasNext() ) { Version version = iterator.nextVersion(); System.out.println("Version [" + version.getName() + "], [" + version.getPrimaryNodeType().getName() + "], created " + version.getCreated().getTime()); NodeIterator nodeIterator = version.getNodes(); while ( nodeIterator.hasNext() ) { Node versionNode = nodeIterator.nextNode(); System.out.println("\tTitle: " + versionNode.getProperty("title").getString()); if ( versionNode.getParent().isNodeType("nt:version") ) { Version parentVersion = (Version) versionNode.getParent(); System.out.println("\tVersion name: " + parentVersion.getName() + " " + parentVersion.getCreated().getTime()); } } } // print base version System.out.println("Base version name: " + ((Session) session).getRootNode().getNode("versionTest").getBaseVersion().getName()); // restore node.checkout(); node.restore("1.0", true); System.out.println("Base version name (after restore): " + ((Session) session).getRootNode().getNode("versionTest").getBaseVersion().getName()); } */ /** * Thanks to Nguyen Ngoc Trung for reporting the issues tested here. * @throws java.lang.Exception */ @Test public void testMultiValuedProperties() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(Parent.class); Node rootNode = ((Session) session).getRootNode().addNode("root"); Parent parent = createParent("John Mugabe"); // test only one value in multi-valued property parent.getTags().clear(); parent.getTags().add("first"); Node newNode = jcrom.addNode(rootNode, parent); assertTrue(newNode.getProperty("tags").getDefinition().isMultiple()); assertEquals(1, newNode.getProperty("tags").getValues().length); Parent fromNode = jcrom.fromNode(Parent.class, newNode); assertEquals(1, fromNode.getTags().size()); assertEquals("first", fromNode.getTags().get(0)); // test changing multiple values to one Parent parent2 = createParent("MultiParent"); Node newNode2 = jcrom.addNode(rootNode, parent2); assertTrue(newNode2.getProperty("tags").getDefinition().isMultiple()); assertEquals(3, newNode2.getProperty("tags").getValues().length); Parent fromNode2 = jcrom.fromNode(Parent.class, newNode2); fromNode2.getTags().clear(); fromNode2.getTags().add("second"); jcrom.updateNode(newNode2, fromNode2); Parent fromNodeAgain = jcrom.fromNode(Parent.class, newNode2); assertNotNull(fromNodeAgain); assertTrue(newNode2.getProperty("tags").getDefinition().isMultiple()); assertEquals(1, newNode2.getProperty("tags").getValues().length); } @Test public void mapObjectsToNodesAndBack() throws Exception { Parent parent = createParent("John Mugabe"); // adopt a child Child adoptedChild = createChild("Mubi"); parent.setAdoptedChild(adoptedChild); // add children parent.addChild(createChild("Jane")); parent.addChild(createChild("Julie")); Child child = createChild("Robert"); parent.addChild(child); // add grand children child.setAdoptedGrandChild(createGrandChild("Jim")); child.addGrandChild(createGrandChild("Adam")); // add a passport photo Photo photo = createPhoto("jcr_passport.jpg"); parent.setPassportPhoto(photo); // multiple files for (int i = 0; i < 3; i++) { parent.addFile(createFile("jcr_image" + i + ".jpg")); } // map to node Jcrom jcrom = new Jcrom(); jcrom.map(Parent.class); // this should automatically map the other classes, since they are referenced Node rootNode = ((Session) session).getRootNode().addNode("root"); // map the object to node String[] mixinTypes = { "mix:referenceable" }; Node newNode = jcrom.addNode(rootNode, parent, mixinTypes); String uuid = newNode.getUUID(); assertTrue(newNode.getUUID() != null && newNode.getUUID().length() > 0); String id = newNode.getIdentifier(); assertTrue(newNode.getIdentifier() != null && newNode.getIdentifier().length() > 0); assertEquals(uuid, id); assertTrue(newNode.getProperty("birthDay").getDate().getTime().equals(parent.getBirthDay())); assertTrue(newNode.getProperty("weight").getDouble() == parent.getWeight()); assertTrue((int) newNode.getProperty("fingers").getDouble() == parent.getFingers()); assertTrue(new Boolean(newNode.getProperty("drivingLicense").getBoolean()).equals(new Boolean(parent.isDrivingLicense()))); assertTrue(newNode.getProperty("hairs").getLong() == parent.getHairs()); assertTrue(newNode.getNode("children").getNodes().nextNode().getName().equals("Jane")); assertTrue(newNode.getProperty("tags").getValues().length == 3); assertTrue(newNode.getProperty("tags").getValues()[0].getString().equals("father")); // map back to object Parent parentFromNode = jcrom.fromNode(Parent.class, newNode); // check the file File imageFileFromNode = new File("target/ogg_copy.jpg"); parentFromNode.getPassportPhoto().getDataProvider().writeToFile(imageFileFromNode); assertTrue(parentFromNode.getPassportPhoto().getFileBytes().length == photo.getFileBytes().length); // check the list of files assertTrue(parentFromNode.getFiles().size() == 3); // validate properties assertTrue(parentFromNode.getUuid().equals(uuid)); assertTrue(parentFromNode.getNickName().equals(parent.getNickName())); assertTrue(parentFromNode.getBirthDay().equals(parent.getBirthDay())); assertTrue(parentFromNode.getWeight() == parent.getWeight()); assertTrue(parentFromNode.getFingers() == parent.getFingers()); assertTrue(new Boolean(parentFromNode.isDrivingLicense()).equals(new Boolean(parent.isDrivingLicense()))); assertTrue(parentFromNode.getHairs() == parent.getHairs()); assertTrue(parentFromNode.getTags().size() == 3); // validate children assertTrue(parentFromNode.getAdoptedChild() != null && parentFromNode.getAdoptedChild().getName().equals(adoptedChild.getName())); assertTrue(parentFromNode.getChildren().size() == 3); assertTrue(parentFromNode.getChildren().get(2).getTitle().equals(child.getTitle())); assertTrue(parentFromNode.getChildren().get(2).getAdoptedGrandChild().getTitle().equals("Jim")); assertTrue(parentFromNode.getChildren().get(2).getGrandChildren().size() == 1); assertTrue(parentFromNode.getChildren().get(2).getGrandChildren().get(0).getTitle().equals("Adam")); // make sure that the JcrParentNode has been properly mapped assertTrue(parentFromNode.getAdoptedChild().getParent().getTitle().equals(parent.getTitle())); assertTrue(parentFromNode.getChildren().get(0).getParent().getTitle().equals(parent.getTitle())); assertTrue(parentFromNode.getChildren().get(2).getAdoptedGrandChild().getParent().getTitle().equals(child.getTitle())); assertTrue(parentFromNode.getChildren().get(2).getGrandChildren().get(0).getParent().getTitle().equals(child.getTitle())); // update the object parent.setNickName("Father"); parent.setBirthDay(new Date()); parent.setWeight(87.5); parent.setFingers(9); parent.setDrivingLicense(false); parent.setHairs(2); parent.getTags().remove(0); parent.addTag("test1"); parent.addTag("test2"); parent.getAdoptedChild().setFingers(10); // update photo metadata parent.getPassportPhoto().setPhotographer("Johnny Bob"); parent.getPassportPhoto().setDataProvider(null); // update the node jcrom.updateNode(newNode, parent); //printNode(newNode, ""); parentFromNode = jcrom.fromNode(Parent.class, newNode); System.out.println("Updated photographer: " + parentFromNode.getPassportPhoto().getPhotographer()); System.out.println("InputStream is null: " + (parentFromNode.getPassportPhoto().getDataProvider().getInputStream() == null)); // validate that the node is updated assertTrue(newNode.getProperty("birthDay").getDate().getTime().equals(parent.getBirthDay())); assertTrue(newNode.getProperty("weight").getDouble() == parent.getWeight()); assertTrue((int) newNode.getProperty("fingers").getDouble() == parent.getFingers()); assertTrue(new Boolean(newNode.getProperty("drivingLicense").getBoolean()).equals(new Boolean(parent.isDrivingLicense()))); assertTrue(newNode.getProperty("hairs").getLong() == parent.getHairs()); assertTrue((int) newNode.getNode("adoptedChild").getNodes().nextNode().getProperty("fingers").getDouble() == parent.getAdoptedChild().getFingers()); assertTrue(parentFromNode.getTags().equals(parent.getTags())); parentFromNode.getFiles().remove(1); parentFromNode.getFiles().add(1, createFile("jcr_image5.jpg")); parentFromNode.addFile(createFile("jcr_image6.jpg")); jcrom.updateNode(newNode, parentFromNode); Parent updatedParent = jcrom.fromNode(Parent.class, newNode); assertTrue(updatedParent.getFiles().size() == parentFromNode.getFiles().size()); // load with filter NodeFilter nodeFilter = new NodeFilter("children", NodeFilter.DEPTH_INFINITE, 1); Parent filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNull(filteredParent.getAdoptedChild()); assertEquals(updatedParent.getChildren().size(), filteredParent.getChildren().size()); assertEquals(updatedParent.getChildren().get(0).getNickName(), filteredParent.getChildren().get(0).getNickName()); // load with filter nodeFilter = new NodeFilter(NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", NodeFilter.DEPTH_INFINITE, 1); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNotNull(filteredParent.getTitle()); assertNotNull(filteredParent.getBirthDay()); assertNull(filteredParent.getAdoptedChild()); assertTrue(filteredParent.getChildren().isEmpty()); // move the node parent.setTitle("Mohammed"); parent.setNickName("Momo"); jcrom.updateNode(newNode, parent); assertFalse(rootNode.hasNode("John_Mugabe")); assertTrue(rootNode.hasNode("Mohammed")); assertTrue(rootNode.getNode("Mohammed").getProperty("nickName").getString().equals("Momo")); // update a child node directly Node adoptedChildNode = rootNode.getNode(parent.getName()).getNode("adoptedChild").getNodes().nextNode(); adoptedChild.setNickName("Mubal"); jcrom.updateNode(adoptedChildNode, adoptedChild); assertTrue(rootNode.getNode(parent.getName()).getNode("adoptedChild").getNodes().nextNode().getProperty("nickName").getString().equals(adoptedChild.getNickName())); } @Test public void testNodeFilter() throws Exception { Parent parent = createParent("John Mugabe"); // adopt a child Child adoptedChild = createChild("Mubi"); parent.setAdoptedChild(adoptedChild); // add children parent.addChild(createChild("Jane")); parent.addChild(createChild("Julie")); Child child = createChild("Robert"); parent.addChild(child); // add grand children child.setAdoptedGrandChild(createGrandChild("Jim")); child.addGrandChild(createGrandChild("Adam")); // add a passport photo Photo photo = createPhoto("jcr_passport.jpg"); parent.setPassportPhoto(photo); // multiple files for (int i = 0; i < 3; i++) { parent.addFile(createFile("jcr_image" + i + ".jpg")); } // map to node Jcrom jcrom = new Jcrom(); jcrom.map(Parent.class); // this should automatically map the other classes, since they are referenced Node rootNode = ((Session) session).getRootNode().addNode("root"); // map the object to node String[] mixinTypes = { "mix:referenceable" }; Node newNode = jcrom.addNode(rootNode, parent, mixinTypes); Parent parentFromNode = jcrom.fromNode(Parent.class, newNode); // load with filter all inclusion NodeFilter nodeFilter = new NodeFilter(NodeFilter.INCLUDE_ALL); Parent filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertEquals(parentFromNode.getTitle(), filteredParent.getTitle()); assertNotNull(filteredParent.getBirthDay()); assertEquals(parentFromNode.getBirthDay().getTime(), filteredParent.getBirthDay().getTime()); assertEquals(0, Double.compare(parentFromNode.getHeight(), filteredParent.getHeight())); assertEquals(parentFromNode.getChildren().size(), filteredParent.getChildren().size()); assertEquals(parentFromNode.getChildren().get(0).getNickName(), filteredParent.getChildren().get(0).getNickName()); assertNotNull(filteredParent.getAdoptedChild()); assertEquals(parentFromNode.getAdoptedChild().getNickName(), filteredParent.getAdoptedChild().getNickName()); // load with filter all exclusion nodeFilter = new NodeFilter(NodeFilter.EXCLUDE_ALL); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNull(filteredParent.getTitle()); assertNull(filteredParent.getBirthDay()); assertNull(filteredParent.getNickName()); assertNull(filteredParent.getAdoptedChild()); assertTrue(filteredParent.getCustomList().isEmpty()); assertTrue(filteredParent.getChildren().isEmpty()); // load with filter inclusion nodeFilter = new NodeFilter("children", NodeFilter.DEPTH_INFINITE, 1); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNull(filteredParent.getAdoptedChild()); assertEquals(parentFromNode.getChildren().size(), filteredParent.getChildren().size()); assertEquals(parentFromNode.getChildren().get(0).getNickName(), filteredParent.getChildren().get(0).getNickName()); // load with filter exclusion nodeFilter = new NodeFilter("-children", NodeFilter.DEPTH_INFINITE, 1); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertTrue(filteredParent.getChildren().isEmpty()); assertNotNull(filteredParent.getAdoptedChild()); assertEquals(parentFromNode.getAdoptedChild().getNickName(), filteredParent.getAdoptedChild().getNickName()); // load with filter property inclusion nodeFilter = new NodeFilter(NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", 0); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertEquals(parentFromNode.getTitle(), filteredParent.getTitle()); assertNotNull(filteredParent.getBirthDay()); assertEquals(parentFromNode.getBirthDay().getTime(), filteredParent.getBirthDay().getTime()); assertNull(filteredParent.getAdoptedChild()); assertTrue(filteredParent.getChildren().isEmpty()); // load with filter property exclusion nodeFilter = new NodeFilter("-" + NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", 1); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNull(filteredParent.getTitle()); assertNull(filteredParent.getBirthDay()); assertEquals(0, Double.compare(parentFromNode.getHeight(), filteredParent.getHeight())); assertEquals(parentFromNode.getChildren().size(), filteredParent.getChildren().size()); assertEquals(parentFromNode.getChildren().get(0).getNickName(), filteredParent.getChildren().get(0).getNickName()); assertNotNull(filteredParent.getAdoptedChild()); assertEquals(parentFromNode.getAdoptedChild().getNickName(), filteredParent.getAdoptedChild().getNickName()); // load with filter property exclusion nodeFilter = new NodeFilter("-" + NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", 0); filteredParent = jcrom.fromNode(Parent.class, newNode, nodeFilter); assertNull(filteredParent.getTitle()); assertNull(filteredParent.getBirthDay()); assertEquals(0, Double.compare(parentFromNode.getHeight(), filteredParent.getHeight())); assertTrue(filteredParent.getChildren().isEmpty()); assertNull(filteredParent.getAdoptedChild()); // ------------------------------- // UPDATE NODE WITH FILTER // ------------------------------- parent = jcrom.fromNode(Parent.class, newNode); String parentTitle = "Jane Mugabe"; parent.setTitle(parentTitle); parent.setBirthDay(new Date()); parent.setDrivingLicense(true); parent.setFingers(20); parent.setHairs(2L); parent.setHeight(2.80); parent.setWeight(62.22); parent.setNickName("Mammy"); parent.getTags().clear(); parent.addTag("mother"); parent.addTag("parent"); // adopt a child parent.setAdoptedChild(createChild("Mubo")); // add children parent.getChildren().clear(); parent.addChild(createChild("John")); parent.addChild(createChild("Raphaƫl")); child = createChild("Robert"); parent.addChild(child); // add grand children child.setAdoptedGrandChild(createGrandChild("Steve")); child.addGrandChild(createGrandChild("Eve")); // add a passport photo parent.setPassportPhoto(createPhoto("jcr_new_passport.jpg")); // multiple files parent.getFiles().clear(); for (int i = 10; i < 13; i++) { parent.addFile(createFile("jcr_image" + i + ".jpg")); } // update with filter all inclusion nodeFilter = new NodeFilter(NodeFilter.INCLUDE_ALL); Node updateNode = jcrom.updateNode(newNode, parent, nodeFilter); Parent updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(parent.getTitle(), updateParentFromNode.getTitle()); assertEquals(parent.getBirthDay(), updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(2, updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size(), updateParentFromNode.getChildren().size()); Parent noUpdateParent = jcrom.fromNode(Parent.class, updateNode); noUpdateParent.setTitle("Bob Nalyd"); noUpdateParent.setBirthDay(null); noUpdateParent.setDrivingLicense(false); noUpdateParent.setFingers(-1); noUpdateParent.setHairs(-1L); noUpdateParent.setHeight(-1); noUpdateParent.setWeight(-1); noUpdateParent.setNickName("Noname"); noUpdateParent.getTags().clear(); // adopt a child noUpdateParent.setAdoptedChild(null); // add children noUpdateParent.getChildren().clear(); // add a passport photo noUpdateParent.setPassportPhoto(null); // multiple files noUpdateParent.getFiles().clear(); // update with filter all inclusion nodeFilter = new NodeFilter(NodeFilter.EXCLUDE_ALL); updateNode = jcrom.updateNode(updateNode, noUpdateParent, nodeFilter); updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(parent.getTitle(), updateParentFromNode.getTitle()); assertEquals(parent.getBirthDay(), updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(parent.getTags().size(), updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size(), updateParentFromNode.getChildren().size()); parent = jcrom.fromNode(Parent.class, updateNode); parent.setTitle("title not updated"); parent.addTag("tag not added"); parent.addChild(createChild("Nico")); // update with filter inclusion nodeFilter = new NodeFilter("children", NodeFilter.DEPTH_INFINITE, 1); updateNode = jcrom.updateNode(updateNode, parent, nodeFilter); updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(parentTitle, updateParentFromNode.getTitle()); assertEquals(parent.getBirthDay(), updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(parent.getTags().size() - 1, updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size(), updateParentFromNode.getChildren().size()); parent = jcrom.fromNode(Parent.class, updateNode); parent.setTitle("title updated"); parent.addTag("tag added"); parent.addChild(createChild("Nico")); // update with filter exclusion nodeFilter = new NodeFilter("-children", NodeFilter.DEPTH_INFINITE, 1); updateNode = jcrom.updateNode(updateNode, parent, nodeFilter); updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(parent.getTitle(), updateParentFromNode.getTitle()); assertEquals(parent.getBirthDay(), updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(parent.getTags().size(), updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size() - 1, updateParentFromNode.getChildren().size()); parent = jcrom.fromNode(Parent.class, updateNode); String updateTitle = "new title updated"; parent.setTitle(updateTitle); Calendar cal = Calendar.getInstance(); cal.set(1981, Calendar.MARCH, 12, 0, 0, 0); Date updateBirthDay = cal.getTime(); parent.setBirthDay(updateBirthDay); parent.addTag("new tag added"); parent.addChild(createChild("Nico")); // update with filter property inclusion nodeFilter = new NodeFilter(NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", NodeFilter.DEPTH_INFINITE, 1); updateNode = jcrom.updateNode(updateNode, parent, nodeFilter); updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(updateTitle, updateParentFromNode.getTitle()); assertEquals(parent.getBirthDay(), updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(parent.getTags().size() - 1, updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size() - 1, updateParentFromNode.getChildren().size()); parent = jcrom.fromNode(Parent.class, updateNode); parent.setTitle("new title not updated"); parent.setBirthDay(new Date()); parent.addTag("new tag added"); parent.addChild(createChild("Nico")); // update with filter property exclusion nodeFilter = new NodeFilter("-" + NodeFilter.PROPERTY_PREFIX + "title, " + NodeFilter.PROPERTY_PREFIX + "birthDay", NodeFilter.DEPTH_INFINITE, 1); updateNode = jcrom.updateNode(updateNode, parent, nodeFilter); updateParentFromNode = jcrom.fromNode(Parent.class, updateNode); assertEquals(updateTitle, updateParentFromNode.getTitle()); assertEquals(updateBirthDay, updateParentFromNode.getBirthDay()); assertEquals(parent.isDrivingLicense(), updateParentFromNode.isDrivingLicense()); assertEquals(parent.getFingers(), updateParentFromNode.getFingers()); assertEquals(parent.getHairs(), updateParentFromNode.getHairs()); assertEquals(0, Double.compare(parent.getHeight(), updateParentFromNode.getHeight())); assertEquals(0, Double.compare(parent.getWeight(), updateParentFromNode.getWeight())); assertEquals(parent.getNickName(), updateParentFromNode.getNickName()); assertEquals(parent.getTags().size(), updateParentFromNode.getTags().size()); assertNotNull(updateParentFromNode.getAdoptedChild()); assertEquals(parent.getAdoptedChild().getTitle(), updateParentFromNode.getAdoptedChild().getTitle()); assertEquals(parent.getChildren().size(), updateParentFromNode.getChildren().size()); } /** * Thanks to Decebal Suiu for contributing this test case. * @throws Exception */ @Test public void testEmptyList() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(Person.class); // create person Person person = new Person(); person.setName("peter"); person.setAge(20); person.setPhones(Arrays.asList(new String[] { "053453553" })); // add person in jcr Node node = jcrom.addNode(((Session) session).getRootNode(), person); Person personFromJcr = jcrom.fromNode(Person.class, node); assertEquals(1, personFromJcr.getPhones().size()); // update person in jcr person.setPhones(new ArrayList<String>()); // reset the phones jcrom.updateNode(node, person); // retrieve updated person from jcr personFromJcr = jcrom.fromNode(Person.class, node); assertFalse(personFromJcr.getPhones().size() == 1); // <<< FAILED } @Test public void testJcrFileMapping() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(JcrFile.class); Node root = ((Session) session).getRootNode().addNode("files"); JcrFile file = createFile("myfile", true); Calendar lastModified = file.getLastModified(); Node node = jcrom.addNode(root, file); assertTrue(node.hasNode("jcr:content")); assertEquals("image/jpeg", node.getNode("jcr:content").getProperty("jcr:mimeType").getString()); assertEquals("UTF-8", node.getNode("jcr:content").getProperty("jcr:encoding").getString()); JcrFile fromNode = jcrom.fromNode(JcrFile.class, node); assertEquals("image/jpeg", fromNode.getMimeType()); assertEquals("UTF-8", fromNode.getEncoding()); assertEquals(lastModified.getTimeInMillis(), fromNode.getLastModified().getTimeInMillis()); assertTrue(fromNode.getDataProvider().getContentLength() > 0); } /** * Thanks to Danilo Barboza and postmaster@doubleegg.com for contributing this test case. * @throws Exception */ @Test public void testCustomJcrFile() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(CustomJCRFile.class); ((Session) session).getRootNode().addNode("customs"); CustomJCRFileDAO dao = new CustomJCRFileDAO(session, jcrom); File imageFile = new File("src/test/resources/ogg.jpg"); CustomJCRFile custom = new CustomJCRFile(); custom.setPath("customs"); custom.setMetadata("My Metadata!"); custom.setEncoding("UTF-8"); custom.setMimeType("image/jpg"); custom.setLastModified(Calendar.getInstance()); custom.setDataProvider(new JcrDataProviderImpl(imageFile)); custom.setName(imageFile.getName()); dao.create(custom); CustomJCRFile customFromJcr = dao.get(custom.getPath()); assertEquals(custom.getName(), customFromJcr.getName()); assertEquals(custom.getEncoding(), customFromJcr.getEncoding()); assertEquals(custom.getMimeType(), customFromJcr.getMimeType()); assertEquals(custom.getMetadata(), customFromJcr.getMetadata()); // Test filtering of jcr:data CustomJCRFile filteredFromJcr = dao.get(custom.getPath(), "-jcr:data", NodeFilter.DEPTH_INFINITE); assertNull(filteredFromJcr.getDataProvider()); customFromJcr.setEncoding("ISO-8859-1"); customFromJcr.setMimeType("image/gif"); customFromJcr.setMetadata("Updated metadata"); customFromJcr.setDataProvider(null); // not going to update the file dao.update(customFromJcr); CustomJCRFile updatedFromJcr = dao.get(customFromJcr.getPath()); assertEquals(customFromJcr.getEncoding(), updatedFromJcr.getEncoding()); assertEquals(customFromJcr.getMimeType(), updatedFromJcr.getMimeType()); assertEquals(customFromJcr.getMetadata(), updatedFromJcr.getMetadata()); } /** * Thanks to eltabo for contributing this test case (Issue 95). * @throws Exception */ @Test public void testJcrFileNodeFromInputStream() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(Document.class); jcrom.map(Parent.class); jcrom.map(JcrFile.class); Node rootNode = ((Session) session).getRootNode().addNode("root"); Parent parent = createParent("Bob"); parent.setJcrFile(createFile("jcr_image.jpg", true)); Node newNode = jcrom.addNode(rootNode, parent); assertNotNull(newNode); assertTrue(newNode.hasNode("jcrFile/jcr_image.jpg/jcr:content")); Node fileNode = newNode.getNode("jcrFile/jcr_image.jpg"); assertEquals("image/jpeg", fileNode.getNode("jcr:content").getProperty("jcr:mimeType").getString()); assertEquals("UTF-8", fileNode.getNode("jcr:content").getProperty("jcr:encoding").getString()); JcrFile fromNode = jcrom.fromNode(JcrFile.class, fileNode); assertEquals("image/jpeg", fromNode.getMimeType()); assertEquals("UTF-8", fromNode.getEncoding()); assertTrue(fromNode.getDataProvider().getContentLength() > 0); } @Test public void testNoChildContainerNode() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(UserProfile.class); Node rootNode = ((Session) session).getRootNode().addNode("noChildTest"); UserProfile userProfile = new UserProfile(); userProfile.setName("john"); Address address = new Address(); address.setStreet("Some street"); address.setPostCode("101"); userProfile.setAddress(address); Node userProfileNode = jcrom.addNode(rootNode, userProfile); UserProfile fromJcr = jcrom.fromNode(UserProfile.class, userProfileNode); assertEquals(address.getName(), "address"); assertEquals(address.getStreet(), fromJcr.getAddress().getStreet()); assertEquals(address.getPostCode(), fromJcr.getAddress().getPostCode()); fromJcr.getAddress().setStreet("Another street"); jcrom.updateNode(userProfileNode, fromJcr); UserProfile updatedFromJcr = jcrom.fromNode(UserProfile.class, userProfileNode); assertEquals(fromJcr.getAddress().getStreet(), updatedFromJcr.getAddress().getStreet()); assertEquals(fromJcr.getAddress().getPostCode(), updatedFromJcr.getAddress().getPostCode()); } @Test public void testSecondLevelFileUpdate() throws Exception { Jcrom jcrom = new Jcrom(); jcrom.map(GrandParent.class).map(Photo.class); GrandParent grandParent = new GrandParent(); grandParent.setName("Charles"); Parent parent = createParent("William"); Photo photo = createPhoto("jcr_passport.jpg"); parent.setPassportPhoto(photo); parent.setJcrFile(createFile("jcr_image.jpg")); grandParent.setChild(parent); Node rootNode = ((Session) session).getRootNode().addNode("root"); Node newNode = jcrom.addNode(rootNode, grandParent); GrandParent fromNode = jcrom.fromNode(GrandParent.class, newNode); fromNode.getChild().getPassportPhoto().setName("bobby.xml"); fromNode.getChild().getPassportPhoto().setPhotographer("Bobbs"); fromNode.getChild().setName("test"); fromNode.getChild().setTitle("Something"); fromNode.getChild().getJcrFile().setName("bob.xml"); jcrom.updateNode(newNode, photo); } /** * Thanks to Bouiaw and Andrius Kurtinaitis for identifying this problem and * contributing this test case. * @throws Exception */ @Test public void testReferenceCycles() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(BadNode.class); BadNode node1 = new BadNode(); node1.body = "body1"; BadNode node2 = new BadNode(); node2.body = "body2"; Node rootNode = ((Session) session).getRootNode(); Node n1 = jcrom.addNode(rootNode, node1); Node n2 = jcrom.addNode(rootNode, node2); node1.reference = node2; node2.reference = node1; jcrom.updateNode(n1, node1); jcrom.updateNode(n2, node2); BadNode fromNode1 = jcrom.fromNode(BadNode.class, n1); BadNode fromNode2 = jcrom.fromNode(BadNode.class, n2); assertEquals(node1.body, fromNode2.reference.body); assertEquals(node2.body, fromNode1.reference.body); } @Test public void testNestedInterfaces() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(AImpl.class).map(BImpl.class).map(CImpl.class); A a = new AImpl("a"); B b = new BImpl("b"); C c = new CImpl("c"); c.setA(a); b.setC(c); a.setB(b); Node rootNode = ((Session) session).getRootNode(); Node nodeA = jcrom.addNode(rootNode, a); A fromNodeA = jcrom.fromNode(A.class, nodeA); assertNotNull(fromNodeA); } /** * Thanks to Leander for identifying this problem and * contributing this test case. * @throws Exception */ @Test public final void testUpdateNodeNodeObject() throws Exception { // initialize JCrom final Jcrom jcrom = new Jcrom(true, true); jcrom.map(Shape.class).map(Triangle.class).map(ShapeParent.class); // setup test data Triangle mainShape = new Triangle(1, 1); mainShape.setName("mainShape"); Triangle childShape = new Triangle(2, 2); childShape.setName("childShape"); ShapeParent shapeParent = new ShapeParent(); shapeParent.setPath("/"); shapeParent.setName("shapeParent"); shapeParent.setMainShape(mainShape); shapeParent.addShape(childShape); // create node and children final Node rootNode = ((Session) session).getRootNode(); jcrom.addNode(rootNode, shapeParent); this.session.save(); // get parent object from created node Node node = rootNode.getNode("shapeParent"); shapeParent = jcrom.fromNode(ShapeParent.class, node); // make some changes mainShape = (Triangle) shapeParent.getMainShape(); assertEquals("Base is wrong", 1, mainShape.getBase(), 0); assertEquals("Height is wrong", 1, mainShape.getHeight(), 0); mainShape.setBase(2); mainShape.setHeight(2); childShape = (Triangle) shapeParent.getShapes().get(0); assertEquals("Base is wrong", 2, mainShape.getBase(), 0); assertEquals("Height is wrong", 2, mainShape.getHeight(), 0); childShape.setBase(3); childShape.setHeight(3); // and update jcrom.updateNode(node, shapeParent); this.session.save(); // now reread the node and check the children node = rootNode.getNode("shapeParent"); shapeParent = jcrom.fromNode(ShapeParent.class, node); mainShape = (Triangle) shapeParent.getMainShape(); // this will fail, still has old value assertEquals("Base is wrong", 2, mainShape.getBase(), 0); assertEquals("Height is wrong", 2, mainShape.getHeight(), 0); childShape = (Triangle) shapeParent.getShapes().get(0); // this will fail, still has old value assertEquals("Base is wrong", 3, childShape.getBase(), 0); assertEquals("Height is wrong", 3, childShape.getHeight(), 0); } /** * Thanks to Leander for contributing this test case. * @throws Exception */ @Test public final void testAddCustomJCRFileParentNode() throws Exception { final Jcrom jcrom = new Jcrom(); jcrom.map(CustomJCRFile.class); jcrom.map(CustomJCRFileParentNode.class); // create root node final Node customs = ((Session) session).getRootNode().addNode("customs"); // initialize the file final CustomJCRFile custom = new CustomJCRFile(); custom.setPath("customs"); custom.setMetadata("My Metadata!"); custom.setEncoding("UTF-8"); custom.setMimeType("image/jpg"); custom.setLastModified(Calendar.getInstance()); final File imageFile = new File("src/test/resources/ogg.jpg"); custom.setDataProvider(new JcrDataProviderImpl(imageFile)); custom.setName(imageFile.getName()); final CustomJCRFileParentNode parent = new CustomJCRFileParentNode(); parent.setName("parent"); parent.setFile(custom); final Node parentNode = jcrom.addNode(customs, parent); final Node customNode = parentNode.getNode("file/ogg.jpg"); // create custom directly, check the node types final NodeType[] mixins = customNode.getMixinNodeTypes(); assertEquals("Mixin size is wrong.", 1, mixins.length); assertEquals("mix:referenceable", mixins[0].getName()); final CustomJCRFileParentNode parentFromJcr = jcrom.fromNode(CustomJCRFileParentNode.class, parentNode); assertNotNull("UUID is null.", parentFromJcr.getFile().getUuid()); } /** * Thanks to Leander for contributing this test case. * @throws Exception */ @Test public final void testAddCustomJCRFile() throws Exception { final Jcrom jcrom = new Jcrom(); jcrom.map(CustomJCRFile.class); jcrom.map(CustomJCRFileParentNode.class); // create root node final Node customs = ((Session) session).getRootNode().addNode("customs"); // initialize the file final CustomJCRFile custom = new CustomJCRFile(); custom.setPath("customs"); custom.setMetadata("My Metadata!"); custom.setEncoding("UTF-8"); custom.setMimeType("image/jpg"); custom.setLastModified(Calendar.getInstance()); final File imageFile = new File("src/test/resources/ogg.jpg"); custom.setDataProvider(new JcrDataProviderImpl(imageFile)); custom.setName(imageFile.getName()); // create custom directly, check the node types final Node customNode = jcrom.addNode(customs, custom); final NodeType[] mixins = customNode.getMixinNodeTypes(); assertEquals("Mixin size is wrong.", 1, mixins.length); assertEquals("mix:referenceable", mixins[0].getName()); final CustomJCRFile customFromJcr = jcrom.fromNode(CustomJCRFile.class, customNode); assertNotNull("UUID is null.", customFromJcr.getUuid()); } @Test public void testProtectedProperties() throws Exception { final Jcrom jcrom = new Jcrom(); jcrom.map(ProtectedPropertyNode.class); ProtectedPropertyNode protectedNode = new ProtectedPropertyNode(); protectedNode.setName("protected_node"); protectedNode.setCreatedBy("John Doe"); final Node rootNode = ((Session) session).getRootNode(); Node createdProtectedNode = jcrom.addNode(rootNode, protectedNode); this.session.save(); JcrUtils.lock(createdProtectedNode, true, false, -1, "the_locker"); ProtectedPropertyNode fromNode = jcrom.fromNode(ProtectedPropertyNode.class, createdProtectedNode); assertNotNull(fromNode); String createdBy = fromNode.getCreatedBy(); assertNotNull(createdBy); Date created = fromNode.getCreated(); assertNotNull(created); long createdTime = created.getTime(); String identifier = fromNode.getIdentifier(); assertNotNull(identifier); String id = fromNode.getId(); assertNotNull(id); assertEquals(identifier, id); String lockOwner = fromNode.getLockOwner(); assertNotNull(lockOwner); assertEquals("the_locker", lockOwner); boolean lockIsDeep = fromNode.isLockIsDeep(); assertEquals(true, lockIsDeep); Thread.sleep(1000); // Properties not saved fromNode.setCreated(new Date()); fromNode.setCreatedBy("Jane Doe"); JcrUtils.unlock(createdProtectedNode); Node updatedProtectedNode = jcrom.updateNode(createdProtectedNode, fromNode); ProtectedPropertyNode fromUpdatedNode = jcrom.fromNode(ProtectedPropertyNode.class, updatedProtectedNode); Date updatedCreated = fromUpdatedNode.getCreated(); assertNotNull(updatedCreated); assertEquals(createdBy, fromUpdatedNode.getCreatedBy()); assertEquals(createdTime, updatedCreated.getTime()); assertEquals(identifier, fromUpdatedNode.getIdentifier()); assertEquals(id, fromUpdatedNode.getId()); assertEquals(fromUpdatedNode.getIdentifier(), fromUpdatedNode.getId()); assertNull(fromUpdatedNode.getLockOwner()); assertFalse(fromUpdatedNode.isLockIsDeep()); } /** * Thanks to postmaster@doubleegg.com for contributing this test case. * Tests adding a Map field to a mapped class at a later date, * fails with PathNotFoundException in JCROM 2.0 */ @Test public void testAddMapToModel() throws Exception { final Jcrom jcrom = new Jcrom(); jcrom.map(EntityToBeModified.class); jcrom.map(EntityModifiedMapFieldAdded.class); EntityToBeModified entity = new EntityToBeModified(); entity.setName("original"); entity.setPath("original"); Node originalNode = jcrom.addNode(((Session) session).getRootNode(), entity); try { jcrom.fromNode(EntityModifiedMapFieldAdded.class, originalNode); } catch (JcrMappingException e) { if (e.getCause() instanceof PathNotFoundException) { fail("PathNotFoundException thrown."); } else { throw e; } } } @Test public void finalFields() throws Exception { final Jcrom jcrom = new Jcrom(); jcrom.map(FinalEntity.class); FinalEntity entity = new FinalEntity("This cannot be changed"); entity.setName("myentity"); final Node parentNode = ((Session) session).getRootNode().addNode("mynode"); jcrom.addNode(parentNode, entity); assertTrue(parentNode.getNode("myentity").hasProperty("immutableString")); assertEquals(entity.getImmutableString(), parentNode.getNode("myentity").getProperty("immutableString").getString()); } @Test public void mapPackage() throws Exception { final Jcrom jcrom = new Jcrom(true, true); jcrom.mapPackage("org.jcrom.entities"); final Node parentNode = ((Session) session).getRootNode().addNode("mynode"); First first = new First(); first.setName("first"); first.setFirstString("nr1"); Second second = new Second(); second.setName("second"); second.setSecondString("nr2"); jcrom.addNode(parentNode, first); jcrom.addNode(parentNode, second); assertTrue(parentNode.getNode("first").hasProperty("firstString")); assertTrue(parentNode.getNode("second").hasProperty("secondString")); } @Test public void parentInterface() throws Exception { final Jcrom jcrom = new Jcrom(true, true); jcrom.map(Square.class).map(WithParentInterface.class).map(Parent.class).map(Child.class); final Node parentNode = ((Session) session).getRootNode().addNode("mynode"); WithParentInterface child = new WithParentInterface(); child.setName("child"); Square square = new Square(3, 3); square.setName("square"); square.setChild(child); Node newNode = jcrom.addNode(parentNode, square); Square fromNode = jcrom.fromNode(Square.class, newNode); assertTrue(square.getArea() == fromNode.getChild().getParent().getArea()); // add unit test to check if we retrieve the parent node after calling method fromNode WithParentInterface child2 = new WithParentInterface(); child2.setName("child2"); Node newNode2 = jcrom.addNode(newNode, child2); WithParentInterface fromNode2 = jcrom.fromNode(WithParentInterface.class, newNode2); assertEquals(0, Double.compare(square.getArea(), fromNode2.getParent().getArea())); Parent parent3 = createParent("daddy"); Child child3 = createChild("child"); parent3.addChild(child3); Node parentNode3 = jcrom.addNode(parentNode, parent3); Node childNode3 = parentNode3.getNode("children/" + PathUtils.createValidName(child3.getName())); Child fromNode3 = jcrom.fromNode(Child.class, childNode3); assertTrue(parent3.getHeight() == fromNode3.getParent().getHeight()); assertTrue(parent3.getTitle() == fromNode3.getParent().getTitle()); } @Test public void customChildContainers() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(Parent.class); Node rootNode = ((Session) session).getRootNode().addNode("root"); Parent parent = createParent("Daddy"); Child listChild1 = createChild("Sonny1"); Child listChild2 = createChild("Sonny2"); Child mapChild1 = createChild("Jane1"); Child mapChild2 = createChild("Jane2"); parent.getCustomList().add(listChild1); parent.getCustomList().add(listChild2); parent.getCustomMap().put(mapChild1.getName(), mapChild1); parent.getCustomMap().put(mapChild2.getName(), mapChild2); Node newNode = jcrom.addNode(rootNode, parent); Parent fromNode = jcrom.fromNode(Parent.class, newNode); assertTrue(fromNode.getCustomList() instanceof LinkedList); assertTrue(fromNode.getCustomMap() instanceof TreeMap); } @Test(expected = PathNotFoundException.class) public void testNodeClassChange() throws Exception { Jcrom jcrom = new Jcrom(true, true); jcrom.map(Rectangle.class).map(Triangle.class); Node rootNode = ((Session) session).getRootNode().addNode("root"); // create the node Triangle triangle = new Triangle(1, 1); triangle.setName("test"); Node newNode = jcrom.addNode(rootNode, triangle); // now switch to another class for the node Rectangle rectangle = new Rectangle(2.5, 3.3); rectangle.setName("test"); jcrom.updateNode(newNode, rectangle); // finally make sure that the old properties have been removed, // this should throw an exception: newNode.getProperty("base"); } }